mysql键、数据库表中数据约束(PRIMARY KEY、UNIQUE、NOT NULL、DEFAULT、CHECK、FOREIGN KEY)复合主键约束、唯一约束、默认约束、检查约束、外键约束。级联 |
您所在的位置:网站首页 › primary key对数据有什么要求 › mysql键、数据库表中数据约束(PRIMARY KEY、UNIQUE、NOT NULL、DEFAULT、CHECK、FOREIGN KEY)复合主键约束、唯一约束、默认约束、检查约束、外键约束。级联 |
先来看看一个mysql中desc xxx表结果解释: “Field” 列显示了表的每个字段(即列)的名称。“Type” 列显示了每个字段的数据类型。“Null” 列指示该字段是否可以为 NULL。如果该字段不允许为 NULL,则此列显示 “NO”;否则,显示 “YES”。“Key” 列显示了该字段是否被定义为某种键。“PRI” 表示该字段是表的主键。“Default” 列显示了该字段的默认值。在这个例子中,所有字段的默认值都是 NULL。“Extra” 列显示了任何额外的信息。在这个例子中,没有字段有额外的信息。下面进入正题。 文章目录 MySQL8 数据库表中字段约束引言主键约束 (PRIMARY KEY)(每个表只能有一个主键,而且主键的值必须是唯一的,并且不能是 NULL;主键可使用单一字段,也可使用两个或更多字段组合成复合主键)关于表的主键(Primary Key)主键约束关于复合主键(Composite Primary Key)复合主键约束 唯一约束 (UNIQUE)(保证字段数据的唯一性;一个表可以存在多个唯一约束)主键约束与唯一约束的区别 非空约束 (NOT NULL)(确保表中的某列(某个字段)不能有 NULL 值)默认约束 (DEFAULT)(如果插入数据没有为某列(某个字段)指定值,则会使用默认值)设置默认约束同时设置非空约束 检查约束 (CHECK)(用于限制某列(某个字段)值的范围)设置了检查约束不代表默认设置了非空约束注意:MySQL 8.0.16 版本以前不支持检查约束 外键约束 (FOREIGN KEY)(与其他表)外键约束常见用法1. 确保数据完整性2. 创建关系示例 3. 级联操作(决定当更改或删除一个被外键引用的主键值时,系统如何自动更新或删除相关的外键值)级联操作拓展 MySQL8 数据库表中字段约束 引言在构建一个数据库模型时,一项重要的任务是确保数据的完整性和准确性。为了实现这个目标,MySQL 提供了多种约束类型来限制对表中数据的修改。这些约束包括主键约束、唯一约束、非空约束、默认约束、检查约束和外键约束。 主键约束 (PRIMARY KEY)(每个表只能有一个主键,而且主键的值必须是唯一的,并且不能是 NULL;主键可使用单一字段,也可使用两个或更多字段组合成复合主键)主键约束定义了表中数据的唯一标识符。每个表只能有一个主键,而且主键的值必须是唯一的,并且不能是 NULL。 CREATE TABLE Employees ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, PRIMARY KEY (ID) );在这个例子中,ID 是 Employees 表的主键。 关于表的主键(Primary Key)主键约束表的主键 (Primary Key) 是一个或多个字段(列),它们唯一地标识了数据库表中的每条记录。主键的重要性质是它必须包含唯一的值,并且不能为 NULL。在数据库设计中,选择适当的主键非常重要,因为主键不仅用于唯一标识记录,而且经常被其他表作为外键引用。 例如,假设有一个名为 “Employees” 的表,其中包含 “ID”, “LastName”, “FirstName” 和 “Age” 四个字段。“ID” 字段可以被设定为主键,因为每个员工都有一个独特的 ID。 CREATE TABLE Employees ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, PRIMARY KEY (ID) );在这个例子中,ID 列是主键,这意味着它必须包含唯一的值(即每个员工的 ID 必须不同),并且不能为 NULL(即每个员工都必须有一个 ID)。 注意:作为主键的字段是自动加上NOT NULL约束的,不写mysql也会帮你自动加上 关于复合主键(Composite Primary Key)复合主键约束除了使用单一字段作为主键,也可以使用两个或更多字段组合成为一个复合主键(Composite Primary Key)。这种情况常见于需要使用两个或更多字段来唯一标识记录的场景。 例如,在一个订单明细表中,可能存在多个订单ID对应多个产品ID的情况。此时,可以将 OrderID 和 ProductID 两列组合作为主键。 CREATE TABLE OrderDetails ( OrderID int NOT NULL, ProductID int NOT NULL, Quantity int, PRIMARY KEY (OrderID, ProductID) );在这个例子中,OrderID 和 ProductID 组合成了一个复合主键。这意味着任何两条记录不能同时具有相同的 OrderID 和 ProductID。 唯一约束 (UNIQUE)(保证字段数据的唯一性;一个表可以存在多个唯一约束)唯一约束保证了表中的所有数据都具有独特的值。一个表可以有多个唯一约束,但每个唯一约束都必须有一个不同的值。 CREATE TABLE Employees ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, UNIQUE (ID) );在这个例子中,ID 列有一个唯一约束,所以任何两行都不能有相同的 ID 值。 主键约束与唯一约束的区别主键约束和唯一约束确实有一些相似之处,但也存在一些重要的区别: NULL值:主键字段不允许插入 NULL 值,而唯一约束的字段是可以接受 NULL 值的(除非显式地声明为 NOT NULL)。 数量:在一个表中,只能有一个主键(尽管这个主键可以由多个字段组成),而一个表可以有多个唯一约束。 用途:主键通常是表的记录被其他表引用的方式(即外键)。而唯一约束则仅确保某个字段的值唯一。 下面是对两者进行展示的例子: CREATE TABLE Example ( ID int NOT NULL, Value int, PRIMARY KEY (ID), UNIQUE (Value) );在这个例子中,ID 是主键,不能为 NULL,并且必须是唯一的。Value 有一个唯一约束,所以它的值也必须是唯一的,但是可以为 NULL。 非空约束 (NOT NULL)(确保表中的某列(某个字段)不能有 NULL 值)非空约束确保表中的某列不能有 NULL 值。 CREATE TABLE Employees ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, );在这个例子中,ID 和 LastName 列都有非空约束,所以它们不能接受 NULL 值。 默认约束 (DEFAULT)(如果插入数据没有为某列(某个字段)指定值,则会使用默认值)默认约束用于向列中插入默认值。如果没有为该列指定值,则会使用默认值。 CREATE TABLE Employees ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int DEFAULT 30, );在这个例子中,如果在插入新行时没有指定 Age 值,则会使用默认值 30。 设置默认约束同时设置非空约束注意:设置默认约束时,也是可以同时设置非空约束的。如: Age int NOT NULL DEFAULT 30; 检查约束 (CHECK)(用于限制某列(某个字段)值的范围)检查约束用于限制列中的值的范围。如果尝试插入违反检查约束的值,那么 MySQL 将拒绝这个操作。 CREATE TABLE Employees ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int CHECK (Age >= 18) );在这个例子中,Age 列有一个检查约束,它要求所有员工的年龄必须大于或等于 18。 设置了检查约束不代表默认设置了非空约束如上例子,虽然 CHECK 约束确保了 Age 字段的值必须大于或等于 18,但它并没有明确禁止 NULL 值。 在 SQL 标准中,NULL 是一个特殊的值,它表示“未知”或“不适用”。当对 NULL 值进行比较时,结果总是未知(也就是说,NULL 既不大于、小于也不等于任何值)。因此,如果 Age 字段包含 NULL,那么 CHECK (Age >= 18) 约束将无法确定是否满足条件,所以它会允许 NULL 值。 如果想确保 Age 字段既不能为 NULL,又必须大于或等于 18,可以这样设置: CREATE TABLE Employees ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int NOT NULL CHECK (Age >= 18) );在这个例子中,NOT NULL 约束确保 Age 字段不能为 NULL,而 CHECK 约束则确保 Age 字段的值必须大于或等于 18。 注意:MySQL 8.0.16 版本以前不支持检查约束在 MySQL 8.0.16 版本以前,尽管可以在语法中包含 CHECK 约束,但 MySQL 并不真正地对其进行检查。也就是说,即使数据违反了 CHECK 约束,MySQL 也会允许这些数据被插入或更新到表中。 从 MySQL 8.0.16 版本开始,MySQL 开始支持 CHECK 约束,并会在数据违反约束时抛出错误。 例如,假设你在 MySQL 8.0.15 或更早的版本上运行以下命令: CREATE TABLE Employees ( ID int NOT NULL, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int CHECK (Age >= 18) ); INSERT INTO Employees (ID, LastName, FirstName, Age) VALUES (1, 'Doe', 'John', 17);虽然 17 小于 CHECK 约束所规定的最小年龄 18,但 MySQL 仍会允许这条 INSERT 语句执行成功。 然而,如果你在 MySQL 8.0.16 或更高版本上运行同样的命令,MySQL 会因为 Age 的值违反了 CHECK 约束而拒绝执行 INSERT 语句,并抛出一个错误。 请注意,在编写涉及 CHECK 约束的代码时,应考虑到正在使用的 MySQL 版本,以确保代码的行为符合预期。 吓得我赶紧看了下我的mysql版本: 8.0.34,还好。 外键约束 (FOREIGN KEY)(与其他表)外键约束用于防止对表进行破坏关系数据完整性的操作。一个表可以有多个外键。 CREATE TABLE Orders ( OrderID int NOT NULL, OrderNumber int NOT NULL, EmployeeID int, PRIMARY KEY (OrderID), FOREIGN KEY (EmployeeID) REFERENCES Employees(ID) );在这个例子中,EmployeeID 是 Orders 表的外键,它引用了 Employees 表的 ID 列。如果尝试插入一个不存在于 Employees 表 ID 列中的值,或者删除 Employees 表中某个被 Orders 表引用的 ID,MySQL 将拒绝这个操作。 外键约束常见用法外键(Foreign Key)是数据库中的一个重要概念,用于链接两个表,并对其中一个表中的数据进行约束。外键在一个表中定义,它引用另一个表的主键。 以下是一些常见的外键约束用法: 1. 确保数据完整性通过使用外键约束,你可以确保在两个相关联的表之间维护数据完整性。如果尝试插入一个不存在的值或删除一个被其他记录引用的值,数据库将抛出错误。 2. 创建关系外键允许你创建表与表之间的关系。例如,你可能有一个 Orders 表和一个 Customers 表,其中 Orders 表中的 CustomerID 列是 Customers 表的 ID 列的外键。这样就创建了从订单到顾客的关系。 示例以下是如何创建 Customers 表和 Orders 表并在它们之间建立关系的示例: 首先,我们创建一个 Customers 表,其中有两个字段:ID 和 Name。其中 ID 是主键。 CREATE TABLE Customers ( ID int NOT NULL, Name varchar(255), PRIMARY KEY (ID) );接下来,我们创建一个 Orders 表,其中有三个字段:OrderID, Product 和 CustomerID。其中 OrderID 是主键,CustomerID 是外键,引用了 Customers 表的 ID 字段。 CREATE TABLE Orders ( OrderID int NOT NULL, Product varchar(255), CustomerID int, PRIMARY KEY (OrderID), FOREIGN KEY (CustomerID) REFERENCES Customers(ID) );现在,我们有了两个表,而且它们之间通过 CustomerID 字段(Orders 表中的外键)和 ID 字段(Customers 表中的主键)建立了关联。这意味着每个订单都可以追溯到一个顾客。同时,如果尝试输入一个不存在于 Customers 表中的 CustomerID,或者删除一个正在被 Orders 表引用的 Customers 表记录,数据库将抛出错误,以保持数据的完整性。 3. 级联操作(决定当更改或删除一个被外键引用的主键值时,系统如何自动更新或删除相关的外键值)当你在定义外键时,可以指定级联操作(如 CASCADE, SET NULL, SET DEFAULT, NO ACTION, RESTRICT)。这决定了当你更改或删除一个被外键引用的主键值时,系统如何自动更新或删除相关的外键值。 例如,假设我们有两个表:Orders 和 Customers。我们可以在 Orders 表中设置一个外键约束,使 CustomerID 引用 Customers 表的 ID 列,并且当 Customers 表中的一条记录被删除时,删除 Orders 表中所有相关的订单: CREATE TABLE Customers ( ID int NOT NULL, Name varchar(255), PRIMARY KEY (ID) ); CREATE TABLE Orders ( OrderID int NOT NULL, CustomerID int, Product varchar(255), PRIMARY KEY (OrderID), FOREIGN KEY (CustomerID) REFERENCES Customers(ID) ON DELETE CASCADE );在这个例子中,如果你删除了一个顾客,那么所有该顾客的订单也将被自动删除,以保持数据的一致性。 级联操作拓展(待更) 参考文章: MySQL Official Documentation, ConstraintsMySQL Tutorial, MySQL Constraints: Enforce Data Integrity |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |